from django.contrib.auth.models import AbstractUser
from django.db import models
from ERP_5.utils.base_model import BaseModel


class Menu(BaseModel):
    """菜单功能的模型类"""
    number = models.IntegerField('排序数字', blank=True, null=True)
    url = models.CharField('菜单访问的URL', max_length=256, blank=True, null=True)
    name = models.CharField('菜单名字', max_length=50)
    # 父菜单对象：parent
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)

    class Meta:
        db_table = 't_menu'
        verbose_name = '功能菜单'
        verbose_name_plural = verbose_name
        ordering = ['number']

    def __str__(self):
        return self.name


# ERP系统的操作用户模型类，默认是采用django自带的User，需要配置settings
class UserModel(AbstractUser):
    phone = models.CharField('手机号码', max_length=11, unique=True, blank=True, null=True)
    real_name = models.CharField('真实姓名', max_length=128, blank=True, null=True)

    roles = models.ManyToManyField('RolesModel', db_table='t_users_roles', blank=True, verbose_name='用户所拥有的角色列表')
    dept = models.ForeignKey('DeptModel', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='用户所在的部门')

    class Meta:
        db_table = 't_user'
        verbose_name = '功能菜单'
        verbose_name_plural = verbose_name
        ordering = ['id']

    def __str__(self):
        return self.username


class PermissionsModel(BaseModel):
    """
    权限模型
    """
    method_choices = (
        ('POST', '增'),
        ('DELETE', '删'),
        ('PUT', '改'),
        ('PATCH', '改局部'),
        ('GET', '查')
    )
    """
    只要是choices参数的字段 如果你想要获取对应信息 固定写法 get_字段名_display()
    print(permission.method)
    print(permission.get_method_display()) 
    """
    name = models.CharField(max_length=50, verbose_name='权限名')
    is_menu = models.BooleanField(verbose_name='是否为菜单', default=True)  # True为菜单,False为接口
    # 操作 , 如果是菜单（非接口）,method
    method = models.CharField(max_length=8, blank=True, default='', choices=method_choices, verbose_name='请求方法')
    path = models.CharField(max_length=200, blank=True, default='', verbose_name='请求路径')
    # 资源
    menu = models.ForeignKey('Menu', null=True, blank=True, related_name='permissions_list', on_delete=models.CASCADE)
    desc = models.CharField(max_length=512, blank=True, default='', verbose_name='权限描述')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 't_permissions'
        verbose_name = '权限'
        verbose_name_plural = verbose_name
        ordering = ['id']


class RolesModel(BaseModel):
    """
    角色
    """
    name = models.CharField(max_length=32, unique=True, verbose_name='角色名字')
    permissions = models.ManyToManyField('PermissionsModel', db_table='t_roles_permissions',
                                         blank=True, verbose_name='权限')

    # 注意在用户模型中最好也要加ManyToManyField

    def __str__(self):
        return self.name

    class Meta:
        db_table = 't_roles'
        verbose_name = '角色'
        verbose_name_plural = verbose_name


class DeptModel(BaseModel):
    """
    组织架构 部门
    """
    name = models.CharField(max_length=32, unique=True, verbose_name='部门')
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children', on_delete=models.CASCADE, verbose_name='父部门')
    address = models.CharField(max_length=128, blank=True, default='', verbose_name='部门地址')


    def __str__(self):
        return self.name

    class Meta:
        db_table = 't_dept'
        verbose_name = '部门'
        verbose_name_plural = verbose_name
